描述
一个改进版的NIM博弈游戏,就是选手可以把一堆拆成非空的两堆,作为一次操作。
思路
sg函数打表找规律,发现4是循环周期。
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define ll long long ll n,num,tmp,ans; const int maxn=1e4+10; int sg[maxn],vis[maxn]; void init() { int i,j,k; sg[0]=0,sg[1]=1; for(i=2;i<=100;i++) { memset(vis,0,sizeof(vis)); for(j=1;j<i-1;j++) vis[sg[j]^sg[i-j]]=1; for(j=0;j<i;j++) vis[sg[j]]=1; for(j=0;;j++) if(!vis[j])break; sg[i]=j; } for(i=1;i<50;i++) cout<<"i = "<<i<<" "<<sg[i]<<endl; } int main(){ cin>>n; while(n--){ ans=0; cin>>num; for(int i=0;i <num; i++){ scanf("%I64d",&tmp); if(tmp%4==0 && tmp/4!=0)ans ^= (tmp-1); else if(tmp%4==3 && (tmp-3)/4!=0) ans ^=(tmp+1); else ans = ans^tmp; } if(ans)printf("Alice\n"); else printf("Bob\n"); } return 0; }
|